package com.ymk.base.mybatis;

import org.apache.ibatis.session.RowBounds;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * Created by laborc on 2017/3/27.
 */
@Component
public class DaoRouter implements IDaoRouter {
    /**
     * 普通查询
     *
     * @param statement  sql语句定义的id
     * @param parameters 参数
     * @return
     */
    public <T> List<T> query(String statement, Object parameters) {
        return sqlSession.selectList(statement, parameters);
    }

    /**
     * 分页查询，注意此处不需要在sql语句中定义startRow和endRow，如果定义，那就用上面的普通查询即可。
     *
     * @param statement
     * @param parameters
     * @param offset
     * @param limit
     * @return
     */
    public <T> List<T> query(String statement, Object parameters, int offset, int limit) {
        return sqlSession.selectList(statement, parameters, new RowBounds(offset, limit));
    }

    /**
     * 返回第一条记录查询结果，如果没有就返回null
     *
     * @param statementName
     * @param parameters
     * @return
     */
    public <T> T queryForObject(String statementName, Object parameters) {
        return sqlSession.selectOne(statementName, parameters);
    }

    /**
     * 更新数据
     *
     * @param statement
     * @param parameters
     * @return
     */
    public int update(String statement, Object parameters) {
        return sqlSession.update(statement, parameters);
    }

    /**
     * 删除
     *
     * @param statement
     * @param parameters
     * @return
     */
    public int delete(String statement, Object parameters) {
        return sqlSession.delete(statement, parameters);
    }

    /**
     * 新增数据，建议在定义sql语句的时候，使用selectKey保证可以返回新增后的主键
     *
     * @param statement
     * @param parameters
     * @return
     */
    public int insert(String statement, Object parameters) {
        return sqlSession.insert(statement, parameters);
    }

    @Override
    public int count(String statement, Object parameters){
        if (!(parameters instanceof Map)) {
            try {
                throw new Exception("com.value.mybatis.DaoRouter,需要使用Map参数");
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        Map params = (Map) parameters;
        params.put(CountPlugin.MYBATIS_COUNT_KEY, true);
        int count = sqlSession.selectOne(statement, parameters);
        params.remove(CountPlugin.MYBATIS_COUNT_KEY, true);
        return count;
    }

    /**
     * 批量删除
     *
     * @param statementName
     * @param dataList
     */
    public void deleteBatch(String statementName, Collection<?> dataList) {
        for (Object data : dataList) {
            this.delete(statementName, data);
        }
    }

    /**
     * 批量新增
     *
     * @param statementName
     * @param dataList
     */
    public void insertBatch(String statementName, Collection<?> dataList) {
        for (Object data : dataList) {
            this.insert(statementName, data);
        }
    }

    /**
     * 批量修改
     *
     * @param statementName
     * @param dataList
     */
    public void updateBatch(String statementName, Collection<?> dataList) {
        for (Object data : dataList) {
            this.update(statementName, data);
        }
    }

    @Autowired
    private SqlSession sqlSession;
}
